// 管理员测试账号
const ADMIN_USER = {
  username: 'admin',
  password: '111111'
}

describe('管理员登录测试', () => {
  beforeEach(() => {
    // 在每个测试用例前访问管理员登录页面
    cy.visit('/admin/login')
    // 等待页面加载完成
    cy.get('.login-box').should('be.visible')
    // 清除 localStorage，确保每次测试都是全新状态
    cy.window().then((win) => {
      win.localStorage.clear()
    })
  })

  describe('登录功能', () => {
    it('流程1：登录表单显示测试', () => {
      // 验证登录表单的关键元素是否存在
      cy.get('.login-header h2').should('contain', '书籍分享平台-管理员')
      cy.get('.el-input input[placeholder="用户名"]').should('exist').and('be.visible')
      cy.get('.el-input input[placeholder="密码"]').should('exist').and('be.visible')
      cy.get('.el-checkbox').should('contain', '记住我').and('be.visible')
      cy.get('.submit-btn').should('exist').and('be.visible').and('not.be.disabled')
    })

    it('流程2：空字段验证测试', () => {
      // 点击提交按钮前确保表单为空
      cy.get('.el-input input[placeholder="用户名"]').should('have.value', '')
      cy.get('.el-input input[placeholder="密码"]').should('have.value', '')
      cy.get('.submit-btn').click()
      // 等待验证消息出现
      cy.get('.el-form-item__error').should('be.visible')
      cy.get('.el-form-item__error').should('have.length', 2) // 用户名和密码两个错误
    })

    it('流程3：用户名格式验证测试', () => {
      cy.get('.el-input input[placeholder="用户名"]').type('ab')
      cy.get('.el-input input[placeholder="密码"]').click() // 触发验证
      // 等待验证消息出现
      cy.get('.el-form-item__error')
        .should('be.visible')
        .and('contain', '用户名只能包含3-10位字母或数字')
    })

    it('流程4：密码格式验证测试', () => {
      cy.get('.el-input input[placeholder="密码"]').type('123')
      cy.get('.el-input input[placeholder="用户名"]').click() // 触发验证
      // 等待验证消息出现
      cy.get('.el-form-item__error')
        .should('be.visible')
        .and('contain', '密码只能包含6-10位字母或数字')
    })

    it('流程5：错误凭据登录测试', () => {
      const wrongAdmin = {
        username: 'wrongadmin',
        password: 'wrongpass'
      }
      
      cy.get('.el-input input[placeholder="用户名"]').type(wrongAdmin.username)
      cy.get('.el-input input[placeholder="密码"]').type(wrongAdmin.password)
      cy.get('.submit-btn').click()
      
      // 验证错误消息
      cy.contains('用户名或密码错误').should('be.visible')
    })

    it('流程6：成功登录测试', () => {
      // 使用正确的管理员账号
      cy.get('.el-input input[placeholder="用户名"]').type(ADMIN_USER.username)
      cy.get('.el-input input[placeholder="密码"]').type(ADMIN_USER.password)
      cy.get('.el-checkbox').click() // 测试"记住我"功能
      cy.get('.submit-btn').click()
      
      // 验证登录成功
      cy.url().should('include', '/admin', { timeout: 10000 })
      
      // 验证本地存储中的管理员信息
      cy.window().then((win) => {
        const token = win.localStorage.getItem('adminToken')
        expect(token).to.exist
        // 验证token格式
        expect(token).to.match(/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/)
      })

      // 验证管理员信息
      cy.request({
        method: 'GET',
        url: '/api/admin/current',
        headers: {
          Authorization: `Bearer ${localStorage.getItem('adminToken')}`
        }
      }).then((response) => {
        expect(response.status).to.eq(200)
        expect(response.body.data.username).to.eq(ADMIN_USER.username)
      })
    })

    it('流程7：记住我功能测试', () => {
      // 使用记住我功能登录
      cy.get('.el-input input[placeholder="用户名"]').type(ADMIN_USER.username)
      cy.get('.el-input input[placeholder="密码"]').type(ADMIN_USER.password)
      cy.get('.el-checkbox').click()
      cy.get('.submit-btn').click()
      
      // 验证登录成功
      cy.url().should('include', '/admin', { timeout: 10000 })
      
      // 刷新页面
      cy.reload()
      
      // 验证仍然保持登录状态
      cy.url().should('include', '/admin')
      cy.window().then((win) => {
        expect(win.localStorage.getItem('adminToken')).to.exist
      })
    })

    it('流程8：Enter键登录测试', () => {
      cy.get('.el-input input[placeholder="用户名"]').type(ADMIN_USER.username)
      cy.get('.el-input input[placeholder="密码"]').type(`${ADMIN_USER.password}{enter}`)
      
      // 验证登录成功
      cy.url().should('include', '/admin', { timeout: 10000 })
    })
  })
}) 